/*
 * Copyright (C) 2010,2011  Paulo Cesar Pereira de Andrade.
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * Authors:
 *	Paulo Cesar Pereira de Andrade
 */

#include "etypes.h"

#ifndef _evector_h
#define _evector_h

/*
 * Prototypes
 */
extern void
evector_set(evector_t *u, evector_t *v);

extern void
evector_coerce(evector_t *u, etype_t t);

extern void
evector_int_and(eint_t a, evector_t *b, etype_t t);

extern void
evector_and_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_mpz_and(empz_t a, evector_t *b, etype_t t);

extern void
evector_and_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_and(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_or(eint_t a, evector_t *b, etype_t t);

extern void
evector_or_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_mpz_or(empz_t a, evector_t *b, etype_t t);

extern void
evector_or_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_or(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_xor(eint_t a, evector_t *b, etype_t t);

extern void
evector_xor_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_mpz_xor(empz_t a, evector_t *b, etype_t t);

extern void
evector_xor_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_xor(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_add(eint_t a, evector_t *b, etype_t t);

extern void
evector_add_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_add(efloat_t a, evector_t *b, etype_t t);

extern void
evector_add_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_add(empz_t a, evector_t *b, etype_t t);

extern void
evector_add_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_add(empq_t a, evector_t *b, etype_t t);

extern void
evector_add_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_add(empr_t a, evector_t *b, etype_t t);

extern void
evector_add_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_cdd_add(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_add_cdd(evector_t *a, ecdd_t b, etype_t t);

extern void
evector_cqq_add(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_add_cqq(evector_t *a, ecqq_t b, etype_t t);

extern void
evector_mpc_add(empc_t a, evector_t *b, etype_t t);

extern void
evector_add_mpc(evector_t *a, empc_t b, etype_t t);

extern void
evector_add(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_sub(eint_t a, evector_t *b, etype_t t);

extern void
evector_sub_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_sub(efloat_t a, evector_t *b, etype_t t);

extern void
evector_sub_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_sub(empz_t a, evector_t *b, etype_t t);

extern void
evector_sub_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_sub(empq_t a, evector_t *b, etype_t t);

extern void
evector_sub_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_sub(empr_t a, evector_t *b, etype_t t);

extern void
evector_sub_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_cdd_sub(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_sub_cdd(evector_t *a, ecdd_t b, etype_t t);

extern void
evector_cqq_sub(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_sub_cqq(evector_t *a, ecqq_t b, etype_t t);

extern void
evector_mpc_sub(empc_t a, evector_t *b, etype_t t);

extern void
evector_sub_mpc(evector_t *a, empc_t b, etype_t t);

extern void
evector_sub(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_mul(eint_t a, evector_t *b, etype_t t);

extern void
evector_mul_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_mul(efloat_t a, evector_t *b, etype_t t);

extern void
evector_mul_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_mul(empz_t a, evector_t *b, etype_t t);

extern void
evector_mul_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_mul(empq_t a, evector_t *b, etype_t t);

extern void
evector_mul_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_mul(empr_t a, evector_t *b, etype_t t);

extern void
evector_mul_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_cdd_mul(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_mul_cdd(evector_t *a, ecdd_t b, etype_t t);

extern void
evector_cqq_mul(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_mul_cqq(evector_t *a, ecqq_t b, etype_t t);

extern void
evector_mpc_mul(empc_t a, evector_t *b, etype_t t);

extern void
evector_mul_mpc(evector_t *a, empc_t b, etype_t t);

extern void
evector_mul(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_div(eint_t a, evector_t *b, etype_t t);

extern void
evector_div_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_div(efloat_t a, evector_t *b, etype_t t);

extern void
evector_div_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_div(empz_t a, evector_t *b, etype_t t);

extern void
evector_div_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_div(empq_t a, evector_t *b, etype_t t);

extern void
evector_div_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_div(empr_t a, evector_t *b, etype_t t);

extern void
evector_div_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_cdd_div(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_div_cdd(evector_t *a, ecdd_t b, etype_t t);

extern void
evector_cqq_div(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_div_cqq(evector_t *a, ecqq_t b, etype_t t);

extern void
evector_mpc_div(empc_t a, evector_t *b, etype_t t);

extern void
evector_div_mpc(evector_t *a, empc_t b, etype_t t);

extern void
evector_div(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_trunc(eint_t a, evector_t *b, etype_t t);

extern void
evector_trunc_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_trunc(efloat_t a, evector_t *b, etype_t t);

extern void
evector_trunc_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_trunc(empz_t a, evector_t *b, etype_t t);

extern void
evector_trunc_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_trunc(empq_t a, evector_t *b, etype_t t);

extern void
evector_trunc_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_trunc(empr_t a, evector_t *b, etype_t t);

extern void
evector_trunc_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_trunc(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_rem(eint_t a, evector_t *b, etype_t t);

extern void
evector_rem_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_rem(efloat_t a, evector_t *b, etype_t t);

extern void
evector_rem_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_rem(empz_t a, evector_t *b, etype_t t);

extern void
evector_rem_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_rem(empq_t a, evector_t *b, etype_t t);

extern void
evector_rem_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_rem(empr_t a, evector_t *b, etype_t t);

extern void
evector_rem_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_rem(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_com(evector_t *v, etype_t t);

extern void
evector_neg(evector_t *v, etype_t t);

extern void
evector_signbit(evector_t *v, etype_t t);

extern void
evector_signum(evector_t *v, etype_t t);

extern void
evector_rational(evector_t *v, etype_t t);

extern void
evector_num(evector_t *v, etype_t t);

extern void
evector_den(evector_t *v, etype_t t);

extern void
evector_real(evector_t *v, etype_t t);

extern void
evector_imag(evector_t *v, etype_t t);

extern void
evector_conj(evector_t *v, etype_t t);

extern void
evector_arg(evector_t *v, etype_t t);

extern void
evector_abs(evector_t *v, etype_t t);

extern void
evector_sqrt(evector_t *v, etype_t t);

extern void
evector_cbrt(evector_t *v, etype_t t);

extern void
evector_sin(evector_t *v, etype_t t);

extern void
evector_cos(evector_t *v, etype_t t);

extern void
evector_tan(evector_t *v, etype_t t);

extern void
evector_asin(evector_t *v, etype_t t);

extern void
evector_acos(evector_t *v, etype_t t);

extern void
evector_atan(evector_t *v, etype_t t);

extern void
evector_sinh(evector_t *v, etype_t t);

extern void
evector_cosh(evector_t *v, etype_t t);

extern void
evector_tanh(evector_t *v, etype_t t);

extern void
evector_asinh(evector_t *v, etype_t t);

extern void
evector_acosh(evector_t *v, etype_t t);

extern void
evector_atanh(evector_t *v, etype_t t);

extern void
evector_proj(evector_t *v, etype_t t);

extern void
evector_exp(evector_t *v, etype_t t);

extern void
evector_log(evector_t *v, etype_t t);

extern void
evector_log2(evector_t *v, etype_t t);

extern void
evector_log10(evector_t *v, etype_t t);

extern void
evector_shl_int32(evector_t *a, eint32_t b, etype_t t);

extern void
evector_int_shl(eint_t a, evector_t *b, etype_t t);

extern void
evector_float_shl(efloat_t a, evector_t *b, etype_t t);

extern void
evector_mpz_shl(empz_t a, evector_t *b, etype_t t);

extern void
evector_mpq_shl(empq_t a, evector_t *b, etype_t t);

extern void
evector_mpr_shl(empr_t a, evector_t *b, etype_t t);

extern void
evector_shl(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_shr_int32(evector_t *a, eint32_t b, etype_t t);

extern void
evector_int_shr(eint_t a, evector_t *b, etype_t t);

extern void
evector_float_shr(efloat_t a, evector_t *b, etype_t t);

extern void
evector_mpz_shr(empz_t a, evector_t *b, etype_t t);

extern void
evector_mpq_shr(empq_t a, evector_t *b, etype_t t);

extern void
evector_mpr_shr(empr_t a, evector_t *b, etype_t t);

extern void
evector_shr(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_mul2_int32(evector_t *a, eint32_t b, etype_t t);

extern void
evector_int_mul2(eint_t a, evector_t *b, etype_t t);

extern void
evector_float_mul2(efloat_t a, evector_t *b, etype_t t);

extern void
evector_mpz_mul2(empz_t a, evector_t *b, etype_t t);

extern void
evector_mpq_mul2(empq_t a, evector_t *b, etype_t t);

extern void
evector_mpr_mul2(empr_t a, evector_t *b, etype_t t);

extern void
evector_cdd_mul2(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_cqq_mul2(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_mpc_mul2(empc_t a, evector_t *b, etype_t t);

extern void
evector_mul2(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_div2_int32(evector_t *a, eint32_t b, etype_t t);

extern void
evector_int_div2(eint_t a, evector_t *b, etype_t t);

extern void
evector_float_div2(efloat_t a, evector_t *b, etype_t t);

extern void
evector_mpz_div2(empz_t a, evector_t *b, etype_t t);

extern void
evector_mpq_div2(empq_t a, evector_t *b, etype_t t);

extern void
evector_mpr_div2(empr_t a, evector_t *b, etype_t t);

extern void
evector_cdd_div2(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_cqq_div2(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_mpc_div2(empc_t a, evector_t *b, etype_t t);

extern void
evector_div2(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_atan2(eint_t a, evector_t *b, etype_t t);

extern void
evector_atan2_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_atan2(efloat_t a, evector_t *b, etype_t t);

extern void
evector_atan2_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_atan2(empz_t a, evector_t *b, etype_t t);

extern void
evector_atan2_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_atan2(empq_t a, evector_t *b, etype_t t);

extern void
evector_atan2_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_atan2(empr_t a, evector_t *b, etype_t t);

extern void
evector_atan2_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_cdd_atan2(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_atan2_cdd(evector_t *a, ecdd_t b, etype_t t);

extern void
evector_cqq_atan2(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_atan2_cqq(evector_t *a, ecqq_t b, etype_t t);

extern void
evector_mpc_atan2(empc_t a, evector_t *b, etype_t t);

extern void
evector_atan2_mpc(evector_t *a, empc_t b, etype_t t);

extern void
evector_atan2(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_pow(eint_t a, evector_t *b, etype_t t);

extern void
evector_pow_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_pow(efloat_t a, evector_t *b, etype_t t);

extern void
evector_pow_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_pow(empz_t a, evector_t *b, etype_t t);

extern void
evector_pow_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_pow(empq_t a, evector_t *b, etype_t t);

extern void
evector_pow_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_pow(empr_t a, evector_t *b, etype_t t);

extern void
evector_pow_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_cdd_pow(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_pow_cdd(evector_t *a, ecdd_t b, etype_t t);

extern void
evector_cqq_pow(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_pow_cqq(evector_t *a, ecqq_t b, etype_t t);

extern void
evector_mpc_pow(empc_t a, evector_t *b, etype_t t);

extern void
evector_pow_mpc(evector_t *a, empc_t b, etype_t t);

extern void
evector_pow(evector_t *a, evector_t *b, etype_t at, etype_t bt);

extern void
evector_int_hypot(eint_t a, evector_t *b, etype_t t);

extern void
evector_hypot_int(evector_t *a, eint_t b, etype_t t);

extern void
evector_float_hypot(efloat_t a, evector_t *b, etype_t t);

extern void
evector_hypot_float(evector_t *a, efloat_t b, etype_t t);

extern void
evector_mpz_hypot(empz_t a, evector_t *b, etype_t t);

extern void
evector_hypot_mpz(evector_t *a, empz_t b, etype_t t);

extern void
evector_mpq_hypot(empq_t a, evector_t *b, etype_t t);

extern void
evector_hypot_mpq(evector_t *a, empq_t b, etype_t t);

extern void
evector_mpr_hypot(empr_t a, evector_t *b, etype_t t);

extern void
evector_hypot_mpr(evector_t *a, empr_t b, etype_t t);

extern void
evector_cdd_hypot(ecdd_t a, evector_t *b, etype_t t);

extern void
evector_hypot_cdd(evector_t *a, ecdd_t b, etype_t t);

extern void
evector_cqq_hypot(ecqq_t a, evector_t *b, etype_t t);

extern void
evector_hypot_cqq(evector_t *a, ecqq_t b, etype_t t);

extern void
evector_mpc_hypot(empc_t a, evector_t *b, etype_t t);

extern void
evector_hypot_mpc(evector_t *a, empc_t b, etype_t t);

extern void
evector_hypot(evector_t *a, evector_t *b, etype_t at, etype_t bt);

#endif /* _evector_h */
